#include <logbase.h>

// 大端小端系统
// 大端：高位在前。小端：低位在前。
// 一个字节．
// 如0x31一个字节,大端二进制是：
// 0B00110001:
//   76543210
// 小端二进制：
// 0B10001100:
//   01234567
// 我们打印%d，他的值是一样的，是因为他们虽然存储不一样，但是实际表示同一个数组。

// 数据从一台设备发送到另外一台设备．设备->(通讯接口：网络/串口/CAN/IIC/SPI/USB)->设备．
// 通讯接口都是按一个字节为单位发送．但通讯接口也是分大小端的．
//　设备发送一个字节时，设备底层会按照通讯接口的大小端格式发送．接收到一个字节时，会按照通讯接口大小端格式接收，确保一个字节的准确．

// 网络、串口等通讯协议有自己的规则（包以字节为单位，每个字节先发高/低位）。大小端系统会以通讯协议按位发送与接收。网络传输的一个字节在大小端系统能保证正确性。

/*
一个字节0x12，大端保存为0x12，0B00010010，以网络格式发送出去(未知格式)。
以网络格式(未知格式)解析到本地，得到小端字节：0x12，0B01001000.
没有影响。
*/

/*
但是如果short类型的2个字节从大端发送到小端就会有问题。
short数据十六进制：0x1234（0B0001 0010 0011 0100）.发送出去按字节0x12(0B0001 0010)，0x34(0B0011 0100)。
小端接收到0x12(0B0100 1000)，0x34(0B0010 1100)。放入short变量中，而表达的值为0x3412(0B0100 1000 0010 1100)。
int32,int64同理。
*/

// 
// 如果大端系统和小端系统通讯时，问题就存在了。
// 但是如果int16,int32,int64就会

union myUnion
{
    uint8_t buffer[2];
    uint16_t value;
};


int main(int argc, char **argv)
{
    // 方式一
    union myUnion tmpunion;
    tmpunion.value = 0x1234;
    logdebugc("value=0x%x, byte[0]=0x%x, byte[1]=0x%x", tmpunion.value, tmpunion.buffer[0], tmpunion.buffer[1]);

    // 方式二
    uint16_t tmpvalue = 0x1234;
    uint8_t *tmpPointer = (uint8_t *)&tmpvalue;
    logdebugc("value=0x%x, byte[0]=0x%x, byte[1]=0x%x", tmpvalue, tmpPointer[0], tmpPointer[1]);

    // 说明linux是小端。
    return 1;
}



